home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 551-575 / disk_560 / muchmore / txt.lzh / txt / MMQText.asm < prev    next >
Assembly Source File  |  1991-10-27  |  17KB  |  732 lines

  1. ;*---------------------------------------------------------------------------
  2. ;  :Program.    MMQText.ASM
  3. ;  :Contents.   Procedure for fast text-output used within MuchMore
  4. ;  :Author.     Fridtjof Siebert
  5. ;  :Address.    Nobileweg 67, D-7-Stgt-40
  6. ;  :Shortcut.   [fbs]
  7. ;  :History.    V 2.0 03-Sep-89 [fbs]
  8. ;  :History.    V 2.6 26-Jun-90 [fbs] removed globals
  9. ;  :History.    V 2.8 26-Dez-90 [fbs] CopyLine removed
  10. ;  :Copyright.  Public Domain
  11. ;  :Language.   68000 Assembler
  12. ;  :Translator. a68k
  13. ;---------------------------------------------------------------------------*
  14.  
  15.   XDEF QText          ; QText Procedure
  16.   XDEF GetFontData    ; GetFontData Procedure
  17.  
  18. ; BitMap:
  19. bm_BytesPerRow = 0
  20. bm_Rows        = 2
  21. bm_Flags       = 4
  22. bm_Depth       = 5
  23. bm_Pad         = 6
  24. bm_Planes      = 8
  25. bm_SIZEOF      = 40
  26.  
  27. ;* d1 - vertical position (pixel position)
  28. ;* a0 - Pointer to String (0C-Termination)
  29. ;* a1 - Pointer to BitMap to store String
  30. ;* a2 - Pointer to TextFont
  31. ;
  32. ;Special codes:
  33. ; 1..16: background color (x-1) & 3, foreground ((x-1) / 4) & 3
  34. ; 17: switch to plain text
  35. ; 18: switch to italics
  36. ; 19: switch to bold
  37. ; 20: switch to italics and bold
  38. ; 21: underline on
  39. ; 22: underline off
  40.  
  41. ; Register use:
  42.  
  43. ; D0: character
  44. ; D1: vertical position
  45. ; D2: bytesperrow
  46. ; D3: to examine character
  47. ; D4: Offset of fontstyle
  48. ; D5: offset (row * bytesperrow)
  49.  
  50. ; A0: points to string
  51. ; A1: plane # 1
  52. ; A2: fontdata
  53. ; A3: character address in font.chardata
  54. ; A4: plane # 2;
  55. ; A5: procedure to type in correct color
  56. ; A6: negative character
  57.  
  58. p1  EQUR A4;
  59. p2  EQUR A1;
  60. chr EQUR A3;
  61. nch EQUR A6;
  62. col EQUR A5;
  63.  
  64. char EQUR d0
  65. vert EQUR d1
  66. bpr  EQUR d2
  67. scratch EQUR d3
  68. style EQUR d4
  69. dadr EQUR d5
  70. ulin EQUR d6  ; underline on ?
  71. nuln EQUR d7  ; underline off?
  72.  
  73. QText:
  74.   move.l      A5,-(A7);
  75.   lea         Col04(PC),col;
  76.   clr         style;
  77.   sf          ulin;
  78.   st          nuln;
  79.   move        bm_BytesPerRow(a1),bpr;
  80.   ext.l       bpr;
  81.   mulu        bpr,vert;
  82.   move.l      bm_Planes(a1),p1;    position in plane #1
  83.   move.l      bm_Planes+4(a1),p2;  position in plane #2
  84.   add.l       vert,p2;
  85.   add.l       vert,p1;               add offset within plane
  86.   move.l      p1,chr;
  87.   move.l      p2,nch;
  88.   move        bpr,vert;
  89.   subq        #1,vert;
  90. clrline:
  91.   clr.l       (chr)+           ; clear line
  92.   clr.l       (chr)+
  93.   clr.l       (nch)+
  94.   clr.l       (nch)+
  95.   dbra        vert,clrline;
  96.  
  97.   move        bpr,vert;
  98.   asl         #3,vert;
  99.   sub         bpr,vert;   vert = 7*bpr;
  100.  
  101. loop:
  102.   move.b      (a0)+,char;           ; get character
  103.   beq         return;
  104.  
  105.   cmp.b       #$20,char;
  106.   bcc         \typechr;
  107.   cmp.b       #17,char;
  108.   blt         \newcol;
  109.   cmp.b       #21,char;
  110.   blt         \newstyle;
  111.   seq         ulin;
  112.   sne         nuln;
  113.   bra.s       loop;
  114. \newstyle;
  115.   sub.b       #17,char;
  116.   ext.w       char;
  117.   move        char,style;
  118.   asl         #1,style;
  119.   add         char,style;
  120.   asl         #8,style;
  121.   add         style,style;
  122.   bra         loop;
  123.  
  124. \newcol:
  125.  
  126.   ext.w       char;
  127.   add.w       char,char;
  128.   move.w      char,scratch;
  129.   add.w       char,char;
  130.   add.w       scratch,char;
  131.   jmp         \whichCol-6(PC,char.w);
  132. \whichCol:
  133.   lea         Col00(PC),col;
  134.   bra.s       \nxt;
  135.   lea         Col01(PC),col;
  136.   bra.s       \nxt;
  137.   lea         Col02(PC),col;
  138.   bra.s       \nxt;
  139.   lea         Col03(PC),col;
  140.   bra.s       \nxt;
  141.   lea         Col04(PC),col;
  142.   bra.s       \nxt;
  143.   lea         Col05(PC),col;
  144.   bra.s       \nxt;
  145.   lea         Col06(PC),col;
  146.   bra.s       \nxt;
  147.   lea         Col07(PC),col;
  148.   bra.s       \nxt;
  149.   lea         Col08(PC),col;
  150.   bra.s       \nxt;
  151.   lea         Col09(PC),col;
  152.   bra.s       \nxt;
  153.   lea         Col10(PC),col;
  154.   bra.s       \nxt;
  155.   lea         Col11(PC),col;
  156.   bra.s       \nxt;
  157.   lea         Col12(PC),col;
  158.   bra.s       \nxt;
  159.   lea         Col13(PC),col;
  160.   bra.s       \nxt;
  161.   lea         Col14(PC),col;
  162.   bra.s       \nxt;
  163.   lea         Col15(PC),col;
  164. \nxt:
  165.   bra         loop;
  166.  
  167. \typechr:
  168.   sub.b       #$20,char;
  169.  
  170.   and         #$ff,char;
  171.   asl         #3,char;
  172.   add         style,char;
  173.   lea         0(a2,char.w),chr;
  174.   lea         $1800(chr),nch
  175.  
  176.   jmp         (col);
  177.  
  178. Col00:
  179.   bra         next;
  180.  
  181. Col01:
  182.   move.b      (nch)+,(p1);
  183.   adda.w      bpr,p1;
  184.   move.b      (nch)+,(p1);
  185.   adda.w      bpr,p1;
  186.   move.b      (nch)+,(p1);
  187.   adda.w      bpr,p1;
  188.   move.b      (nch)+,(p1);
  189.   adda.w      bpr,p1;
  190.   move.b      (nch)+,(p1);
  191.   adda.w      bpr,p1;
  192.   move.b      (nch)+,(p1);
  193.   adda.w      bpr,p1;
  194.   move.b      (nch)+,(p1);
  195.   adda.w      bpr,p1;
  196.   move.b      (nch)+,(p1);
  197.   and.b       nuln,(p1);
  198.   suba.w      vert,p1;
  199.   bra         next;
  200.  
  201. Col02:
  202.   move.b      (nch)+,(p2);
  203.   adda.w      bpr,p2;
  204.   move.b      (nch)+,(p2);
  205.   adda.w      bpr,p2;
  206.   move.b      (nch)+,(p2);
  207.   adda.w      bpr,p2;
  208.   move.b      (nch)+,(p2);
  209.   adda.w      bpr,p2;
  210.   move.b      (nch)+,(p2);
  211.   adda.w      bpr,p2;
  212.   move.b      (nch)+,(p2);
  213.   adda.w      bpr,p2;
  214.   move.b      (nch)+,(p2);
  215.   adda.w      bpr,p2;
  216.   move.b      (nch)+,(p2);
  217.   and.b       nuln,(p2);
  218.   suba.w      vert,p2;
  219.   bra         next;
  220.  
  221. Col03:
  222.   move.b      (nch),(p1);
  223.   move.b      (nch)+,(p2);
  224.   move        bpr,dadr;
  225.   move.b      (nch),0(p1,dadr.w);
  226.   move.b      (nch)+,0(p2,dadr.w);
  227.   add         bpr,dadr;
  228.   move.b      (nch),0(p1,dadr.w);
  229.   move.b      (nch)+,0(p2,dadr.w);
  230.   add         bpr,dadr;
  231.   move.b      (nch),0(p1,dadr.w);
  232.   move.b      (nch)+,0(p2,dadr.w);
  233.   add         bpr,dadr;
  234.   move.b      (nch),0(p1,dadr.w);
  235.   move.b      (nch)+,0(p2,dadr.w);
  236.   add         bpr,dadr;
  237.   move.b      (nch),0(p1,dadr.w);
  238.   move.b      (nch)+,0(p2,dadr.w);
  239.   add         bpr,dadr;
  240.   move.b      (nch),0(p1,dadr.w);
  241.   move.b      (nch)+,0(p2,dadr.w);
  242.   add         bpr,dadr;
  243.   move.b      (nch),0(p1,dadr.w);
  244.   move.b      (nch)+,0(p2,dadr.w);
  245.   and.b       nuln,0(p1,dadr.w);
  246.   and.b       nuln,0(p2,dadr.w);
  247.   bra         next;
  248.  
  249. Col04:
  250.   move.b      (chr)+,(p1);
  251.   adda.w      bpr,p1;
  252.   move.b      (chr)+,(p1);
  253.   adda.w      bpr,p1;
  254.   move.b      (chr)+,(p1);
  255.   adda.w      bpr,p1;
  256.   move.b      (chr)+,(p1);
  257.   adda.w      bpr,p1;
  258.   move.b      (chr)+,(p1);
  259.   adda.w      bpr,p1;
  260.   move.b      (chr)+,(p1);
  261.   adda.w      bpr,p1;
  262.   move.b      (chr)+,(p1);
  263.   adda.w      bpr,p1;
  264.   move.b      (chr)+,(p1);
  265.   or.b        ulin,(p1);
  266.   suba.w      vert,p1;
  267.   bra         next;
  268.  
  269. Col05:
  270.   st          (p1);
  271.   move        bpr,dadr;
  272.   st          0(p1,dadr.w);
  273.   add         bpr,dadr;
  274.   st          0(p1,dadr.w);
  275.   add         bpr,dadr;
  276.   st          0(p1,dadr.w);
  277.   add         bpr,dadr;
  278.   st          0(p1,dadr.w);
  279.   add         bpr,dadr;
  280.   st          0(p1,dadr.w);
  281.   add         bpr,dadr;
  282.   st          0(p1,dadr.w);
  283.   add         bpr,dadr;
  284.   st          0(p1,dadr.w);
  285.   bra         next;
  286.  
  287. Col06:
  288.   move.b      (chr)+,(p1);
  289.   move.b      (nch)+,(p2);
  290.   move        bpr,dadr;
  291.   move.b      (chr)+,0(p1,dadr.w);
  292.   move.b      (nch)+,0(p2,dadr.w);
  293.   add         bpr,dadr;
  294.   move.b      (chr)+,0(p1,dadr.w);
  295.   move.b      (nch)+,0(p2,dadr.w);
  296.   add         bpr,dadr;
  297.   move.b      (chr)+,0(p1,dadr.w);
  298.   move.b      (nch)+,0(p2,dadr.w);
  299.   add         bpr,dadr;
  300.   move.b      (chr)+,0(p1,dadr.w);
  301.   move.b      (nch)+,0(p2,dadr.w);
  302.   add         bpr,dadr;
  303.   move.b      (chr)+,0(p1,dadr.w);
  304.   move.b      (nch)+,0(p2,dadr.w);
  305.   add         bpr,dadr;
  306.   move.b      (chr)+,0(p1,dadr.w);
  307.   move.b      (nch)+,0(p2,dadr.w);
  308.   add         bpr,dadr;
  309.   move.b      (chr)+,0(p1,dadr.w);
  310.   move.b      (nch)+,0(p2,dadr.w);
  311.   or.b        ulin,0(p1,dadr.w);
  312.   and.b       nuln,0(p2,dadr.w);
  313.   bra         next;
  314.  
  315. Col07:
  316.   st          (p1);
  317.   move.b      (nch)+,(p2);
  318.   move        bpr,dadr;
  319.   st          0(p1,dadr.w);
  320.   move.b      (nch)+,0(p2,dadr.w);
  321.   add         bpr,dadr;
  322.   st          0(p1,dadr.w);
  323.   move.b      (nch)+,0(p2,dadr.w);
  324.   add         bpr,dadr;
  325.   st          0(p1,dadr.w);
  326.   move.b      (nch)+,0(p2,dadr.w);
  327.   add         bpr,dadr;
  328.   st          0(p1,dadr.w);
  329.   move.b      (nch)+,0(p2,dadr.w);
  330.   add         bpr,dadr;
  331.   st          0(p1,dadr.w);
  332.   move.b      (nch)+,0(p2,dadr.w);
  333.   add         bpr,dadr;
  334.   st          0(p1,dadr.w);
  335.   move.b      (nch)+,0(p2,dadr.w);
  336.   add         bpr,dadr;
  337.   st          0(p1,dadr.w);
  338.   move.b      (nch)+,0(p2,dadr.w);
  339.   and.b       nuln,0(p2,dadr.w);
  340.   bra         next;
  341.  
  342. Col08:
  343.   move.b      (chr)+,(p2);
  344.   adda.w      bpr,p2;
  345.   move.b      (chr)+,(p2);
  346.   adda.w      bpr,p2;
  347.   move.b      (chr)+,(p2);
  348.   adda.w      bpr,p2;
  349.   move.b      (chr)+,(p2);
  350.   adda.w      bpr,p2;
  351.   move.b      (chr)+,(p2);
  352.   adda.w      bpr,p2;
  353.   move.b      (chr)+,(p2);
  354.   adda.w      bpr,p2;
  355.   move.b      (chr)+,(p2);
  356.   adda.w      bpr,p2;
  357.   move.b      (chr)+,(p2);
  358.   or.b        ulin,(p2);
  359.   suba.w      vert,p2;
  360.   bra         next;
  361.  
  362. Col09:
  363.   move.b      (nch)+,(p1);
  364.   move.b      (chr)+,(p2);
  365.   move        bpr,dadr;
  366.   move.b      (nch)+,0(p1,dadr.w);
  367.   move.b      (chr)+,0(p2,dadr.w);
  368.   add         bpr,dadr;
  369.   move.b      (nch)+,0(p1,dadr.w);
  370.   move.b      (chr)+,0(p2,dadr.w);
  371.   add         bpr,dadr;
  372.   move.b      (nch)+,0(p1,dadr.w);
  373.   move.b      (chr)+,0(p2,dadr.w);
  374.   add         bpr,dadr;
  375.   move.b      (nch)+,0(p1,dadr.w);
  376.   move.b      (chr)+,0(p2,dadr.w);
  377.   add         bpr,dadr;
  378.   move.b      (nch)+,0(p1,dadr.w);
  379.   move.b      (chr)+,0(p2,dadr.w);
  380.   add         bpr,dadr;
  381.   move.b      (nch)+,0(p1,dadr.w);
  382.   move.b      (chr)+,0(p2,dadr.w);
  383.   add         bpr,dadr;
  384.   move.b      (nch)+,0(p1,dadr.w);
  385.   move.b      (chr)+,0(p2,dadr.w);
  386.   and.b       nuln,0(p1,dadr.w);
  387.   or.b        ulin,0(p2,dadr.w);
  388.   bra         next;
  389.  
  390. Col10:
  391.   st          (p2);
  392.   adda.w      bpr,p2;
  393.   st          (p2);
  394.   adda.w      bpr,p2;
  395.   st          (p2);
  396.   adda.w      bpr,p2;
  397.   st          (p2);
  398.   adda.w      bpr,p2;
  399.   st          (p2);
  400.   adda.w      bpr,p2;
  401.   st          (p2);
  402.   adda.w      bpr,p2;
  403.   st          (p2);
  404.   adda.w      bpr,p2;
  405.   st          (p2);
  406.   suba.w      vert,p2;
  407.   bra         next;
  408.  
  409. Col11:
  410.   move.b      (nch)+,(p1);
  411.   st          (p2);
  412.   move        bpr,dadr;
  413.   move.b      (nch)+,0(p1,dadr.w);
  414.   st          0(p2,dadr.w);
  415.   add         bpr,dadr;
  416.   move.b      (nch)+,0(p1,dadr.w);
  417.   st          0(p2,dadr.w);
  418.   add         bpr,dadr;
  419.   move.b      (nch)+,0(p1,dadr.w);
  420.   st          0(p2,dadr.w);
  421.   add         bpr,dadr;
  422.   move.b      (nch)+,0(p1,dadr.w);
  423.   st          0(p2,dadr.w);
  424.   add         bpr,dadr;
  425.   move.b      (nch)+,0(p1,dadr.w);
  426.   st          0(p2,dadr.w);
  427.   add         bpr,dadr;
  428.   move.b      (nch)+,0(p1,dadr.w);
  429.   st          0(p2,dadr.w);
  430.   add         bpr,dadr;
  431.   move.b      (nch)+,0(p1,dadr.w);
  432.   st          0(p2,dadr.w);
  433.   and.b       nuln,0(p1,dadr.w);
  434.   bra         next;
  435.  
  436. Col12:
  437.   move.b      (chr),(p1);
  438.   move.b      (chr)+,(p2);
  439.   move        bpr,dadr;
  440.   move.b      (chr),0(p1,dadr.w);
  441.   move.b      (chr)+,0(p2,dadr.w);
  442.   add         bpr,dadr;
  443.   move.b      (chr),0(p1,dadr.w);
  444.   move.b      (chr)+,0(p2,dadr.w);
  445.   add         bpr,dadr;
  446.   move.b      (chr),0(p1,dadr.w);
  447.   move.b      (chr)+,0(p2,dadr.w);
  448.   add         bpr,dadr;
  449.   move.b      (chr),0(p1,dadr.w);
  450.   move.b      (chr)+,0(p2,dadr.w);
  451.   add         bpr,dadr;
  452.   move.b      (chr),0(p1,dadr.w);
  453.   move.b      (chr)+,0(p2,dadr.w);
  454.   add         bpr,dadr;
  455.   move.b      (chr),0(p1,dadr.w);
  456.   move.b      (chr)+,0(p2,dadr.w);
  457.   add         bpr,dadr;
  458.   move.b      (chr),0(p1,dadr.w);
  459.   move.b      (chr)+,0(p2,dadr.w);
  460.   or.b        ulin,0(p1,dadr.w);
  461.   or.b        ulin,0(p2,dadr.w);
  462.   bra         next;
  463.  
  464. Col13:
  465.   st          (p1);
  466.   move.b      (chr)+,(p2);
  467.   move        bpr,dadr;
  468.   st          0(p1,dadr.w);
  469.   move.b      (chr)+,0(p2,dadr.w);
  470.   add         bpr,dadr;
  471.   st          0(p1,dadr.w);
  472.   move.b      (chr)+,0(p2,dadr.w);
  473.   add         bpr,dadr;
  474.   st          0(p1,dadr.w);
  475.   move.b      (chr)+,0(p2,dadr.w);
  476.   add         bpr,dadr;
  477.   st          0(p1,dadr.w);
  478.   move.b      (chr)+,0(p2,dadr.w);
  479.   add         bpr,dadr;
  480.   st          0(p1,dadr.w);
  481.   move.b      (chr)+,0(p2,dadr.w);
  482.   add         bpr,dadr;
  483.   st          0(p1,dadr.w);
  484.   move.b      (chr)+,0(p2,dadr.w);
  485.   add         bpr,dadr;
  486.   st          0(p1,dadr.w);
  487.   move.b      (chr)+,0(p2,dadr.w);
  488.   or.b        ulin,0(p2,dadr.w);
  489.   bra         next;
  490.  
  491. Col14:
  492.   move.b      (chr)+,(p1);
  493.   st          (p2);
  494.   move        bpr,dadr;
  495.   move.b      (chr)+,0(p1,dadr.w);
  496.   st          0(p2,dadr.w);
  497.   add         bpr,dadr;
  498.   move.b      (chr)+,0(p1,dadr.w);
  499.   st          0(p2,dadr.w);
  500.   add         bpr,dadr;
  501.   move.b      (chr)+,0(p1,dadr.w);
  502.   st          0(p2,dadr.w);
  503.   add         bpr,dadr;
  504.   move.b      (chr)+,0(p1,dadr.w);
  505.   st          0(p2,dadr.w);
  506.   add         bpr,dadr;
  507.   move.b      (chr)+,0(p1,dadr.w);
  508.   st          0(p2,dadr.w);
  509.   add         bpr,dadr;
  510.   move.b      (chr)+,0(p1,dadr.w);
  511.   st          0(p2,dadr.w);
  512.   add         bpr,dadr;
  513.   move.b      (chr)+,0(p1,dadr.w);
  514.   st          0(p2,dadr.w);
  515.   or.b        ulin,0(p1,dadr.w);
  516.   bra         next;
  517.  
  518. Col15:
  519.   st          (p1);
  520.   st          (p2);
  521.   move        bpr,dadr;
  522.   st          0(p1,dadr.w);
  523.   st          0(p2,dadr.w);
  524.   add         bpr,dadr;
  525.   st          0(p1,dadr.w);
  526.   st          0(p2,dadr.w);
  527.   add         bpr,dadr;
  528.   st          0(p1,dadr.w);
  529.   st          0(p2,dadr.w);
  530.   add         bpr,dadr;
  531.   st          0(p1,dadr.w);
  532.   st          0(p2,dadr.w);
  533.   add         bpr,dadr;
  534.   st          0(p1,dadr.w);
  535.   st          0(p2,dadr.w);
  536.   add         bpr,dadr;
  537.   st          0(p1,dadr.w);
  538.   st          0(p2,dadr.w);
  539.   add         bpr,dadr;
  540.   st          0(p1,dadr.w);
  541.   st          0(p2,dadr.w);
  542.  
  543. next:
  544.   addq.l      #1,p2;
  545.   addq.l      #1,p1;
  546.   bra         loop;
  547.  
  548. return:
  549.   move.l      (A7)+,A5;
  550.   rts;
  551.  
  552. ;---------------------------------------------------------------------------*)
  553. ; GetFontData
  554.  
  555. ; A0: Pointer to font's chardata
  556. ; A1: Pointer to fontdata-Array
  557. ; D7: Line Modulo
  558.  
  559. ch EQUR A0;
  560. fd EQUR A1;
  561. ad EQUR A2;
  562. j  EQUR D0;
  563. x  EQUR D1;
  564. c  EQUR D2;
  565. d  EQUR D3;
  566. e  EQUR D4;
  567. x1 EQUR D5;
  568. x2 EQUR D6;
  569. x3 EQUR D7;
  570.  
  571. GetFontData:
  572.  
  573.         move.w  D7,-(A7);
  574.         move    #0,j;
  575. jloop:  move    j,x;
  576.         asl     #3,x;
  577.         move    x,x1;
  578.         move    x,x2;
  579.         move    x,x3;
  580.         add     #$600,x1;
  581.         add     #$c00,x2;
  582.         add     #$1200,x3;
  583.         lea     0(ch,j),ad;
  584. ; Byte 0:
  585.         move.b  (ad),c;
  586.         move.b  c,0(fd,x);
  587.         move.b  c,d;
  588.         lsr.b   #2,d;
  589.         bcc     \1;
  590.         bset    #0,d;
  591. \1:     move.b  d,0(fd,x1);
  592.         move.b  c,e;
  593.         lsr.b   #1,e;
  594.         or.b    c,e;
  595.         move.b  e,0(fd,x2);
  596.         move.b  d,e;
  597.         lsr.b   #1,e;
  598.         or.b    d,e;
  599.         move.b  e,0(fd,x3);
  600. ; Byte 1:
  601.         adda.w  (A7),ad
  602.         move.b  (ad),c;
  603.         move.b  c,1(fd,x);
  604.         move.b  c,d;
  605.         lsr.b   #2,d;
  606.         bcc     \2;
  607.         bset    #0,d;
  608. \2:     move.b  d,1(fd,x1);
  609.         move.b  c,e;
  610.         lsr.b   #1,e;
  611.         or.b    c,e;
  612.         move.b  e,1(fd,x2);
  613.         move.b  d,e;
  614.         lsr.b   #1,e;
  615.         or.b    d,e;
  616.         move.b  e,1(fd,x3);
  617. ; Byte 2:
  618.         adda.w  (A7),ad
  619.         move.b  (ad),c;
  620.         move.b  c,2(fd,x);
  621.         move.b  c,d;
  622.         lsr.b   #1,d;
  623.         bcc     \3;
  624.         bset    #0,d;
  625. \3:     move.b  d,2(fd,x1);
  626.         move.b  c,e;
  627.         lsr.b   #1,e;
  628.         or.b    c,e;
  629.         move.b  e,2(fd,x2);
  630.         move.b  d,e;
  631.         lsr.b   #1,e;
  632.         or.b    d,e;
  633.         move.b  e,2(fd,x3);
  634. ; Byte 3:
  635.         adda.w  (A7),ad
  636.         move.b  (ad),c;
  637.         move.b  c,3(fd,x);
  638.         move.b  c,d;
  639.         lsr.b   #1,d;
  640.         bcc     \4;
  641.         bset    #0,d;
  642. \4:     move.b  d,3(fd,x1);
  643.         move.b  c,e;
  644.         lsr.b   #1,e;
  645.         or.b    c,e;
  646.         move.b  e,3(fd,x2);
  647.         move.b  d,e;
  648.         lsr.b   #1,e;
  649.         or.b    d,e;
  650.         move.b  e,3(fd,x3);
  651. ; Byte 4:
  652.         adda.w  (A7),ad
  653.         move.b  (ad),c;
  654.         move.b  c,4(fd,x);
  655.         move.b  c,4(fd,x1);
  656.         move.b  c,e;
  657.         lsr.b   #1,e;
  658.         or.b    c,e;
  659.         move.b  e,4(fd,x2);
  660.         move.b  e,4(fd,x3);
  661. ; Byte 5:
  662.         adda.w  (A7),ad
  663.         move.b  (ad),c;
  664.         move.b  c,5(fd,x);
  665.         move.b  c,5(fd,x1);
  666.         move.b  c,e;
  667.         lsr.b   #1,e;
  668.         or.b    c,e;
  669.         move.b  e,5(fd,x2);
  670.         move.b  e,5(fd,x3);
  671. ; Byte 6:
  672.         adda.w  (A7),ad
  673.         move.b  (ad),c;
  674.         move.b  c,6(fd,x);
  675.         move.b  c,d;
  676.         lsl.b   #1,d;
  677.         bcc     \7;
  678.         bset    #7,d;
  679. \7:     move.b  d,6(fd,x1);
  680.         move.b  c,e;
  681.         lsr.b   #1,e;
  682.         or.b    c,e;
  683.         move.b  e,6(fd,x2);
  684.         move.b  d,e;
  685.         lsr.b   #1,e;
  686.         or.b    d,e;
  687.         move.b  e,6(fd,x3);
  688. ; Byte 7:
  689.         adda.w  (A7),ad
  690.         move.b  (ad),c;
  691.         move.b  c,7(fd,x);
  692.         move.b  c,d;
  693.         lsl.b   #1,d;
  694.         bcc     \8;
  695.         bset    #7,d;
  696. \8:     move.b  d,7(fd,x1);
  697.         move.b  c,e;
  698.         lsr.b   #1,e;
  699.         or.b    c,e;
  700.         move.b  e,7(fd,x2);
  701.         move.b  d,e;
  702.         lsr.b   #1,e;
  703.         or.b    d,e;
  704.         move.b  e,7(fd,x3);
  705.  
  706.         addq    #1,j;
  707.         move    j,x;
  708.         cmp     #$30,x;
  709.         beq.s   newlin;
  710.         cmp     #$60,x;
  711.         beq.s   newlin;
  712.         cmp     #$90,x;
  713.         bne.s   nextl;
  714. newlin: move    (A7),x;
  715.         asl     #3,x;
  716.         sub     #$30,x;
  717.         adda.w  x,ch;
  718. nextl:  cmp     #$c0,j;
  719.         blt     jloop;
  720.  
  721.         move.l  fd,ad;
  722.         adda.w  #$1800,ad;
  723.         move    #$5ff,j;
  724. invers: move.l  (fd)+,c;
  725.         not.l   c;
  726.         move.l  c,(ad)+;
  727.         dbra    j,invers;
  728.         lea     2(A7),A7;
  729.         rts;
  730.  
  731.         END
  732.